<?php

class RemovepicsApp extends MallbaseApp
{
    /**
     * 删除冗余图片
     */
    public function index()
    {
        // 开启错误提示
        ini_set('display_errors', 'On');
        error_reporting(E_ALL);

        // 取出磁盘上的所有文件
        $files = $this->my_dir(ROOT_PATH . '/data/files');
        // 所有文件路径的列表
        $files = $this->array_to_url($this->array_dot($files));
        // 所有数据库的文件列表
        $goodsModel = &M('goods');
        $goodsSpecModel = &M('goodsspec');
        // 规格表
        $spec_datas = $this->db->getAll("SELECT spec_1 FROM {$goodsSpecModel->table}");

        echo '<pre>';
        print_r($spec_datas);
        echo '</pre>';
        exit;

        // goods
        // description是富文本，需要单独提取出来
        // 商品表
        $goods_datas = $this->db->getAll("SELECT description,default_image FROM {$goodsModel->table} LIMIT 10");
        // 格式化$spec_datas
        // 保存为所有的数据库图片地址
        $db_files = [];
        foreach ($spec_datas as $k => $data) {
            $db_files[] = $data['spec_1'];
        }

        // 格式化description和default_image
        // 最终合并进$db_files成为最终的数据库图片结果
        foreach ($goods_datas as $k => $data) {
            $list = $this->get_images_by_pattern($data['description']);
            array_push($list, $data['default_image']);
            // 遍历添加进入
            foreach ($list as $item) {
                $db_files[] = $item;
            }
        }

        // 给$files添加data/files/路径
        foreach ($files as $k => $file) {
            if (strpos($file, 'data/files/') === false) {
                $files[$k] = 'data/files/' . $file;
            }
        }

        // 查出差集
        $diff = array_diff($files, $db_files);

        // 最终结果
        echo '<pre>';
        print_r($diff);
        echo '</pre>';
        exit;

        // 然后删除这些垃圾图片
        foreach ($diff as $file) {
            $filepath = ROOT_PATH . '/' . $file;
            echo $filepath;
            if (file_exists($filepath)) {
                @unlink($filepath);
            }
        }

        // 最终结果
        echo 'Not used pictures deleted successfully';
        exit();
    }

    /**
     * PHP遍历一个文件夹下所有文件和子文件夹的函数
     * @param $dir string 目录路径
     * @return array 返回一个数组
     */
    public function my_dir($dir)
    {
        $files = [];
        if (@$handle = opendir($dir)) { //注意这里要加一个@，不然会有warning错误提示：）
            while (($file = readdir($handle)) !== false) {
                if ($file != ".." && $file != ".") { //排除根目录；
                    if (is_dir($dir . "/" . $file)) { //如果是子文件夹，就进行递归
                        $files[$file] = $this->my_dir($dir . "/" . $file);
                    } else { //不然就将文件的名字存入数组；
                        $files[] = $file;
                    }
                }
            }
            closedir($handle);
            return $files;
        }
    }


    /**
     * 把多维数组分割为一维数组
     *
     * @param array $array
     * @param string $prepend
     * @return array
     */
    public function array_dot($array, $prepend = '')
    {
        $results = [];

        foreach ($array as $key => $value) {
            if (is_array($value) && !empty($value)) {
                $results = array_merge($results, $this->array_dot($value, $prepend . $key . '/'));
            } else {
                // 需要保持原来的key
                $results[$prepend . $key] = $value;
            }
        }

        return $results;
    }

    /**
     * 把文件列表转变为带路径的文件地址
     * @param $array
     * @return array
     */
    public function array_to_url($array)
    {
        // 逻辑
        $result = [];
        foreach ($array as $k => $v) {
            $key = substr($k, 0, strrpos($k, '/'));
            $result[] = $key . '/' . $v;
        }
        // 返回
        return $result;
    }

    /**
     * 用正则表达式把富文本中的img标签提取出来
     * @param $content
     * @return array
     */
    public function get_images_by_pattern($content)
    {
        // 逻辑
        // 图片匹配模式，第3个标签即为图片列表
        $pattern = '/<img(.*)src\s*=("|\')(.*)(\'|")(.*)>/iU';
        preg_match_all($pattern, $content, $matches);
        // 去掉列表中的./
        $result = [];
        foreach ($matches[3] as $v) {
            if (strpos($v, './') !== false) {
                $result[] = substr($v, strlen('./'));
            } else {
                $result[] = $v;
            }
        }
        // 返回
        return $result;
    }
}